The world cup 2022 will be hosted by Qatar in 2022. We wanted to try and predict which country has the biggest probability of winning the tournament by using supervised learning.

1. Data

The data that we will be using is already cleaned and does not require pre-processing.

The data set provides a complete overview of all international football matches played since the 90s. On top of that, the strength of each team is provided by incorporating the FIFA rankings as well as player strengths based on the EA Sport FIFA video game. It is available on kaggle

Variables

  • date : date of the match
  • home_team : name of the home team
  • away_team : name of the away team
  • home_team_continent : continent of the home team
  • away_team_continent : continent of the away team
  • home_team_fifa_rank : FIFA rank of the home team when the match took place
  • away_team_fifa_rank : FIFA rank of the away team when the match took place
  • home_team_total_fifa_points : total number of FIFA points of the home team at the time of the match
  • away_team_total_fifa_points : total number of FIFA points of the away team at the time of the match
  • home_team_score : full-time home score (excluding penalty shootout)
  • away_team_score : full-time away score (excluding penalty shootout)
  • tournament : name of tournament
  • city : name of the city where the match was played
  • country : name of the country where the match was played
  • neutral_location :
    • TRUE : the match was played at a neutral venue
  • shoot_out:
    • TRUE : the match included a penalty shootout
  • home_team_result : result of the home team (including penalty shootout)
  • home_team_goalkeeper_score : FIFA game score of the highest ranked GK of the home team
  • away_team_goalkeeper_score : FIFA game score of the highest ranked GK of the away team
  • home_team_mean_defense_score : Average FIFA game score of the 4 highest ranked defensive players of the home team
  • away_team_mean_defense_score : Average FIFA game score of the 4 highest ranked defensive players of the away team
  • home_team_mean_midfield_score : Average FIFA game score of the 4 highest ranked midfield players of the home team
  • away_team_mean_midfield_score : Average FIFA game score of the 4 highest ranked midfield players of the away team
  • home_team_mean_offense_score : Average FIFA game score of the 3 highest ranked attacking players of the home team, including wing players
  • away_team_mean_offense_score : Average FIFA game score of the 3 highest ranked attacking players of the away team, including wing players

2. EDA

spec(input_data)
cols(
  date = col_date(format = ""),
  home_team = col_character(),
  away_team = col_character(),
  home_team_continent = col_character(),
  away_team_continent = col_character(),
  home_team_fifa_rank = col_double(),
  away_team_fifa_rank = col_double(),
  home_team_total_fifa_points = col_double(),
  away_team_total_fifa_points = col_double(),
  home_team_score = col_double(),
  away_team_score = col_double(),
  tournament = col_character(),
  city = col_character(),
  country = col_character(),
  neutral_location = col_logical(),
  shoot_out = col_character(),
  home_team_result = col_character(),
  home_team_goalkeeper_score = col_double(),
  away_team_goalkeeper_score = col_double(),
  home_team_mean_defense_score = col_double(),
  home_team_mean_offense_score = col_double(),
  home_team_mean_midfield_score = col_double(),
  away_team_mean_defense_score = col_double(),
  away_team_mean_offense_score = col_double(),
  away_team_mean_midfield_score = col_double()
)
skim_without_charts(input_data)
── Data Summary ────────────────────────
                           Values    
Name                       input_data
Number of rows             23921     
Number of columns          25        
_______________________              
Column type frequency:               
  character                9         
  Date                     1         
  logical                  1         
  numeric                  14        
________________________             
Group variables            None      

Missing data

Top 5 teams in 2022

FIFA rankings over time

Teams with strongest GK

Teams with strongest defense

Teams with strongest midfield

Teams with strongest offense

Is it better to play at home ?

Correlation Matrix

LS0tCnRpdGxlOiAiV29ybGQgQ3VwIDIwMjIiCm91dHB1dDoKICBodG1sX25vdGVib29rOiBkZWZhdWx0CiAgcGRmX2RvY3VtZW50OiBkZWZhdWx0Ci0tLQoKYGBge3IsIGVjaG89RkFMU0V9CmxpYnJhcnkoZHBseXIpCmxpYnJhcnkoc2tpbXIpCmxpYnJhcnkocGxvdGx5KQpsaWJyYXJ5KHNjYWxlcykKbGlicmFyeShjb3JycGxvdCkKbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkoZ2dhbmltYXRlKQoKYGBgCgpUaGUgd29ybGQgY3VwIDIwMjIgd2lsbCBiZSBob3N0ZWQgYnkgUWF0YXIgaW4gMjAyMi4gV2Ugd2FudGVkIHRvIHRyeSBhbmQgcHJlZGljdAp3aGljaCBjb3VudHJ5IGhhcyB0aGUgYmlnZ2VzdCBwcm9iYWJpbGl0eSBvZiB3aW5uaW5nIHRoZSB0b3VybmFtZW50IGJ5IHVzaW5nIHN1cGVydmlzZWQgbGVhcm5pbmcuCgojIDEuIERhdGEKClRoZSBkYXRhIHRoYXQgd2Ugd2lsbCBiZSB1c2luZyBpcyBhbHJlYWR5IGNsZWFuZWQgYW5kIGRvZXMgbm90IHJlcXVpcmUgcHJlLXByb2Nlc3NpbmcuCgpUaGUgZGF0YSBzZXQgcHJvdmlkZXMgYSBjb21wbGV0ZSBvdmVydmlldyBvZiBhbGwgaW50ZXJuYXRpb25hbCBmb290YmFsbCBtYXRjaGVzIHBsYXllZCBzaW5jZSB0aGUgOTBzLiBPbiB0b3Agb2YgdGhhdCwgdGhlIHN0cmVuZ3RoIG9mIGVhY2ggdGVhbSBpcyBwcm92aWRlZCBieSBpbmNvcnBvcmF0aW5nIHRoZSBGSUZBIHJhbmtpbmdzIGFzIHdlbGwgYXMgcGxheWVyIHN0cmVuZ3RocyBiYXNlZCBvbiB0aGUgRUEgU3BvcnQgRklGQSB2aWRlbyBnYW1lLiBJdCBpcyBhdmFpbGFibGUgb24gW2thZ2dsZV0oaHR0cHM6Ly93d3cua2FnZ2xlLmNvbS9kYXRhc2V0cy9icmVuZGE4OS9maWZhLXdvcmxkLWN1cC0yMDIyKQoKIyMgVmFyaWFibGVzCgotIGBkYXRlYCA6IGRhdGUgb2YgdGhlIG1hdGNoCi0gYGhvbWVfdGVhbWAgOiBuYW1lIG9mIHRoZSBob21lIHRlYW0KLSBgYXdheV90ZWFtYCA6IG5hbWUgb2YgdGhlIGF3YXkgdGVhbQotIGBob21lX3RlYW1fY29udGluZW50YCA6IGNvbnRpbmVudCBvZiB0aGUgaG9tZSB0ZWFtCi0gYGF3YXlfdGVhbV9jb250aW5lbnRgIDogY29udGluZW50IG9mIHRoZSBhd2F5IHRlYW0KLSBgaG9tZV90ZWFtX2ZpZmFfcmFua2AgOiBGSUZBIHJhbmsgb2YgdGhlIGhvbWUgdGVhbSB3aGVuIHRoZSBtYXRjaCB0b29rIHBsYWNlCi0gYGF3YXlfdGVhbV9maWZhX3JhbmtgIDogRklGQSByYW5rIG9mIHRoZSBhd2F5IHRlYW0gd2hlbiB0aGUgbWF0Y2ggdG9vayBwbGFjZQotIGBob21lX3RlYW1fdG90YWxfZmlmYV9wb2ludHNgIDogdG90YWwgbnVtYmVyIG9mIEZJRkEgcG9pbnRzIG9mIHRoZSBob21lIHRlYW0gYXQgdGhlIHRpbWUgb2YgdGhlIG1hdGNoCi0gYGF3YXlfdGVhbV90b3RhbF9maWZhX3BvaW50c2AgOiB0b3RhbCBudW1iZXIgb2YgRklGQSBwb2ludHMgb2YgdGhlIGF3YXkgdGVhbSBhdCB0aGUgdGltZSBvZiB0aGUgbWF0Y2gKLSBgaG9tZV90ZWFtX3Njb3JlYCA6IGZ1bGwtdGltZSBob21lIHNjb3JlIChleGNsdWRpbmcgcGVuYWx0eSBzaG9vdG91dCkKLSBgYXdheV90ZWFtX3Njb3JlYCA6IGZ1bGwtdGltZSBhd2F5IHNjb3JlIChleGNsdWRpbmcgcGVuYWx0eSBzaG9vdG91dCkKLSBgdG91cm5hbWVudGAgOiBuYW1lIG9mIHRvdXJuYW1lbnQKLSBgY2l0eWAgOiBuYW1lIG9mIHRoZSBjaXR5IHdoZXJlIHRoZSBtYXRjaCB3YXMgcGxheWVkCi0gYGNvdW50cnlgIDogbmFtZSBvZiB0aGUgY291bnRyeSB3aGVyZSB0aGUgbWF0Y2ggd2FzIHBsYXllZAotIGBuZXV0cmFsX2xvY2F0aW9uYCA6CiAgLSBgVFJVRWAgOiB0aGUgbWF0Y2ggd2FzIHBsYXllZCBhdCBhIG5ldXRyYWwgdmVudWUKLSBgc2hvb3Rfb3V0YDoKICAtIGBUUlVFYCA6IHRoZSBtYXRjaCBpbmNsdWRlZCBhIHBlbmFsdHkgc2hvb3RvdXQKLSBgaG9tZV90ZWFtX3Jlc3VsdGAgOiByZXN1bHQgb2YgdGhlIGhvbWUgdGVhbSAoaW5jbHVkaW5nIHBlbmFsdHkgc2hvb3RvdXQpCi0gYGhvbWVfdGVhbV9nb2Fsa2VlcGVyX3Njb3JlYCA6IEZJRkEgZ2FtZSBzY29yZSBvZiB0aGUgaGlnaGVzdCByYW5rZWQgR0sgb2YgdGhlIGhvbWUgdGVhbQotIGBhd2F5X3RlYW1fZ29hbGtlZXBlcl9zY29yZWAgOiBGSUZBIGdhbWUgc2NvcmUgb2YgdGhlIGhpZ2hlc3QgcmFua2VkIEdLIG9mIHRoZSBhd2F5IHRlYW0KLSBgaG9tZV90ZWFtX21lYW5fZGVmZW5zZV9zY29yZWAgOiBBdmVyYWdlIEZJRkEgZ2FtZSBzY29yZSBvZiB0aGUgNCBoaWdoZXN0IHJhbmtlZCBkZWZlbnNpdmUgcGxheWVycyBvZiB0aGUgaG9tZSB0ZWFtCi0gYGF3YXlfdGVhbV9tZWFuX2RlZmVuc2Vfc2NvcmVgIDogQXZlcmFnZSBGSUZBIGdhbWUgc2NvcmUgb2YgdGhlIDQgaGlnaGVzdCByYW5rZWQgCmRlZmVuc2l2ZSBwbGF5ZXJzIG9mIHRoZSBhd2F5IHRlYW0KLSBgaG9tZV90ZWFtX21lYW5fbWlkZmllbGRfc2NvcmVgIDogQXZlcmFnZSBGSUZBIGdhbWUgc2NvcmUgb2YgdGhlIDQgaGlnaGVzdCByYW5rZWQgbWlkZmllbGQgcGxheWVycyBvZiB0aGUgaG9tZSB0ZWFtCi0gYGF3YXlfdGVhbV9tZWFuX21pZGZpZWxkX3Njb3JlYCA6IEF2ZXJhZ2UgRklGQSBnYW1lIHNjb3JlIG9mIHRoZSA0IGhpZ2hlc3QgcmFua2VkIG1pZGZpZWxkIHBsYXllcnMgb2YgdGhlIGF3YXkgdGVhbQotIGBob21lX3RlYW1fbWVhbl9vZmZlbnNlX3Njb3JlYCA6IEF2ZXJhZ2UgRklGQSBnYW1lIHNjb3JlIG9mIHRoZSAzIGhpZ2hlc3QgcmFua2VkIGF0dGFja2luZyBwbGF5ZXJzIG9mIHRoZSBob21lIHRlYW0sIGluY2x1ZGluZyB3aW5nIHBsYXllcnMKLSBgYXdheV90ZWFtX21lYW5fb2ZmZW5zZV9zY29yZWAgOiBBdmVyYWdlIEZJRkEgZ2FtZSBzY29yZSBvZiB0aGUgMyBoaWdoZXN0IHJhbmtlZCBhdHRhY2tpbmcgcGxheWVycyBvZiB0aGUgYXdheSB0ZWFtLCBpbmNsdWRpbmcgd2luZyBwbGF5ZXJzCgojIDIuIEVEQQoKYGBge3J9CiMgY2xhc3Mgb2YgZWFjaCB2YXJpYWJsZQpzcGVjKGlucHV0X2RhdGEpCmBgYApgYGB7cn0KIyBzdW1tYXJ5CnNraW1fd2l0aG91dF9jaGFydHMoaW5wdXRfZGF0YSkKYGBgCgojIyBNaXNzaW5nIGRhdGEKCmBgYHtyfQppbnB1dF9kYXRhICU+JQogIHN1bW1hcmlzZV9hbGwobGlzdCh+aXMubmEoLikpKSU+JQogIHBpdm90X2xvbmdlcihldmVyeXRoaW5nKCksCiAgICAgICAgICAgICAgIG5hbWVzX3RvID0gInZhcmlhYmxlcyIsIHZhbHVlc190bz0ibWlzc2luZyIpICU+JQogIGNvdW50KHZhcmlhYmxlcywgbWlzc2luZykgJT4lCiAgZ2dwbG90KGFlcyh5PXZhcmlhYmxlcyx4PW4sZmlsbD1taXNzaW5nKSkrCiAgZ2VvbV9jb2woKSsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YygiI0EzQkU4QyIsIiNFQkNCOEIiKSkrCiAgdGhlbWUoYXhpcy50aXRsZS55PWVsZW1lbnRfYmxhbmsoKSkKYGBgCgoKIyMgVG9wIDUgdGVhbXMgaW4gMjAyMgoKYGBge3J9CiMgR2V0IHRoZSByYW5raW5nIG9mIGFsbCBob21lIHRlYW1zCmhvbWUgPC0KICBpbnB1dF9kYXRhICU+JSAKICBzZWxlY3QoZGF0ZSwgaG9tZV90ZWFtLCBob21lX3RlYW1fZmlmYV9yYW5rKSAlPiUgCiAgcmVuYW1lKHRlYW0gPSBob21lX3RlYW0sIHJhbmtpbmcgPSBob21lX3RlYW1fZmlmYV9yYW5rKQoKIyBHZXQgdGhlIHJhbmtpbmcgb2YgYWxsIGF3YXkgdGVhbXMKYXdheSA8LQogIGlucHV0X2RhdGEgJT4lIAogIHNlbGVjdChkYXRlLCBhd2F5X3RlYW0sIGF3YXlfdGVhbV9maWZhX3JhbmspICU+JSAKICByZW5hbWUodGVhbSA9IGF3YXlfdGVhbSwgcmFua2luZyA9IGF3YXlfdGVhbV9maWZhX3JhbmspCgojIENvbWJpbmUgYm90aCBkYXRhIGZyYW1lcyBpbnRvIG9uZQpmaWZhX3JhbmtpbmcgPC0gcmJpbmQoaG9tZSwgYXdheSkKCiMgR2V0IHRoZSBsYXRlc3QgcmFua2luZyBvZiBlYWNoIGNvdW50cnkgYmFzZWQgb24gdGhlaXIgbW9zdCByZWNlbnQgbWF0Y2gKbGF0ZXN0X2ZpZmFfcmFua2luZyA8LQogIGZpZmFfcmFua2luZyAlPiUgCiAgYXJyYW5nZSh0ZWFtLCBkZXNjKGRhdGUpKSAlPiUgCiAgZ3JvdXBfYnkodGVhbSkgJT4lIAogIG11dGF0ZShyb3dfbnVtYmVyID0gcm93X251bWJlcih0ZWFtKSkgJT4lIAogIGZpbHRlcihyb3dfbnVtYmVyID09IDEpICU+JSAKICBzZWxlY3QoLXJvd19udW1iZXIsIC1kYXRlKSAlPiUgCiAgYXJyYW5nZShyYW5raW5nKQogIApoZWFkKGxhdGVzdF9maWZhX3JhbmtpbmcsIDEwKQpgYGAKCiMjIEZJRkEgcmFua2luZ3Mgb3ZlciB0aW1lCgpgYGB7cn0KdG9wNV9saXN0IDwtIGhlYWQobGF0ZXN0X2ZpZmFfcmFua2luZywgNSkkdGVhbQoKdG9wNV9yYW5raW5nIDwtCiAgZmlmYV9yYW5raW5nICAlPiUgCiAgZmlsdGVyKHRlYW0gJWluJSB0b3A1X2xpc3QpCgpwIDwtCiAgZ2dwbG90KGRhdGEgPSB0b3A1X3JhbmtpbmcsCiAgICAgICAgIG1hcHBpbmcgPSBhZXMoCiAgICAgICAgICAgeCA9IGRhdGUsCiAgICAgICAgICAgeSA9IHJhbmtpbmcsCiAgICAgICAgICAgZ3JvdXAgPSB0ZWFtLAogICAgICAgICAgIGNvbG9yID0gdGVhbQogICAgICAgICApKSArCiAgZ2VvbV9saW5lKCkgKwogIHNjYWxlX3lfcmV2ZXJzZSgpICsKICBsYWJzKAogICAgeCA9ICJEYXRlIiwKICAgIHkgPSAiRklGQSBSYW5raW5nIiwKICAgIGNvbG9yID0gIlRlYW0iLAogICAgdGl0bGUgPSAiRklGQSBSYW5raW5ncyBvZiB0aGUgMjAyMiBUb3AgNSB0ZWFtcyIKICApCgpnZ3Bsb3RseShwKQoKYGBgCgojIyBUZWFtcyB3aXRoIHN0cm9uZ2VzdCBHSwoKYGBge3J9CiMgR2F0aGVyIGdvYWxrZWVwZXIgZGF0YSBmcm9tIG1hdGNoZXMKZ2tfaG9tZSA8LQogIGlucHV0X2RhdGEgJT4lIAogIHNlbGVjdChkYXRlLCBob21lX3RlYW0sIGhvbWVfdGVhbV9nb2Fsa2VlcGVyX3Njb3JlKSAlPiUgCiAgcmVuYW1lKHRlYW0gPSBob21lX3RlYW0sIGdvYWxrZWVwZXJfcmF0aW5nID0gaG9tZV90ZWFtX2dvYWxrZWVwZXJfc2NvcmUpCgpna19hd2F5IDwtCiAgaW5wdXRfZGF0YSAlPiUgCiAgc2VsZWN0KGRhdGUsIGF3YXlfdGVhbSwgYXdheV90ZWFtX2dvYWxrZWVwZXJfc2NvcmUpICU+JSAKICByZW5hbWUodGVhbSA9IGF3YXlfdGVhbSwgZ29hbGtlZXBlcl9yYXRpbmcgPSBhd2F5X3RlYW1fZ29hbGtlZXBlcl9zY29yZSkKCmdrX3JhdGluZyA8LSBkcm9wX25hKHJiaW5kKGdrX2hvbWUsIGdrX2F3YXkpKQoKIyBHZXQgbGF0ZXN0IHJhdGluZyBvZiBlYWNoIHRlYW0ncyBnb2Fsa2VlcGVyIGFuZCBzaG93IHRvcCAxMApsYXRlc3RfZ2tfcmF0aW5nIDwtCiAgZ2tfcmF0aW5nICU+JSAKICBhcnJhbmdlKHRlYW0sIGRlc2MoZGF0ZSkpICU+JSAKICBncm91cF9ieSh0ZWFtKSAlPiUgCiAgbXV0YXRlKHJvd19udW1iZXIgPSByb3dfbnVtYmVyKHRlYW0pKSAlPiUgCiAgZmlsdGVyKHJvd19udW1iZXIgPT0gMSkgJT4lIAogIHNlbGVjdCgtcm93X251bWJlciwgLWRhdGUpICU+JSAKICBhcnJhbmdlKC1nb2Fsa2VlcGVyX3JhdGluZykKCmdncGxvdChkYXRhID0gaGVhZChsYXRlc3RfZ2tfcmF0aW5nLCAxMCksIG1hcHBpbmcgPSBhZXMoeD1nb2Fsa2VlcGVyX3JhdGluZywgeT1yZW9yZGVyKHRlYW0sIGdvYWxrZWVwZXJfcmF0aW5nKSwgbGFiZWw9Z29hbGtlZXBlcl9yYXRpbmcpKSArCiAgZ2VvbV9jb2woZmlsbD0iIzg4QzBEMCIpICsKICBnZW9tX3RleHQocG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSkpICsKICBsYWJzKHRpdGxlID0gIlRvcCAxMCB0ZWFtcyB3aXRoIHRoZSBzdHJvbmdlc3QgZ29hbGtlZXBlciIsCiAgICAgICBzdWJ0aXRsZSA9ICJCYXNlZCBvbiB0aGUgaGlnaGVzdCByYXRlZCBnb2Fsa2VlcGVyIG9mIGVhY2ggdGVhbSIsCiAgICAgICB4PSJHb2Fsa2VlcGVyIFJhdGluZyIsCiAgICAgICB5PSJDb3VudHJ5IikKYGBgCiMjIyBUZWFtcyB3aXRoIHN0cm9uZ2VzdCBkZWZlbnNlCgpgYGB7cn0KIyBHYXRoZXIgZ29hbGtlZXBlciBhbmQgZGVmZW5zZSBkYXRhIGZyb20gbWF0Y2hlcwpkZWZfaG9tZSA8LQogIGlucHV0X2RhdGEgJT4lIAogIHNlbGVjdChkYXRlLCBob21lX3RlYW0sIGhvbWVfdGVhbV9nb2Fsa2VlcGVyX3Njb3JlLCBob21lX3RlYW1fbWVhbl9kZWZlbnNlX3Njb3JlKSAlPiUgCiAgcmVuYW1lKHRlYW0gPSBob21lX3RlYW0sIGdvYWxrZWVwZXJfcmF0aW5nID0gaG9tZV90ZWFtX2dvYWxrZWVwZXJfc2NvcmUsIG1lYW5fZGVmZW5zZV9yYXRpbmcgPSBob21lX3RlYW1fbWVhbl9kZWZlbnNlX3Njb3JlKQoKZGVmX2F3YXkgPC0KICBpbnB1dF9kYXRhICU+JSAKICBzZWxlY3QoZGF0ZSwgYXdheV90ZWFtLCBhd2F5X3RlYW1fZ29hbGtlZXBlcl9zY29yZSwgYXdheV90ZWFtX21lYW5fZGVmZW5zZV9zY29yZSkgJT4lIAogIHJlbmFtZSh0ZWFtID0gYXdheV90ZWFtLCBnb2Fsa2VlcGVyX3JhdGluZyA9IGF3YXlfdGVhbV9nb2Fsa2VlcGVyX3Njb3JlLCBtZWFuX2RlZmVuc2VfcmF0aW5nID0gYXdheV90ZWFtX21lYW5fZGVmZW5zZV9zY29yZSkKCmRlZl9yYXRpbmcgPC0gZHJvcF9uYShyYmluZChkZWZfaG9tZSwgZGVmX2F3YXkpKQoKIyBHZXQgbGF0ZXN0IGNvbWJpbmVkIHJhdGluZyBvZiBlYWNoIHRlYW0gYW5kIHNob3cgdG9wIDEwCmxhdGVzdF9kZWZfcmF0aW5nIDwtCiAgZGVmX3JhdGluZyAlPiUgCiAgYXJyYW5nZSh0ZWFtLCBkZXNjKGRhdGUpKSAlPiUgCiAgbXV0YXRlKHRvdGFsX2RlZiA9IGdvYWxrZWVwZXJfcmF0aW5nICsgbWVhbl9kZWZlbnNlX3JhdGluZykgJT4lIAogIGdyb3VwX2J5KHRlYW0pICU+JSAKICBtdXRhdGUocm93X251bWJlciA9IHJvd19udW1iZXIodGVhbSkpICU+JSAKICBmaWx0ZXIocm93X251bWJlcj09MSkgJT4lIAogIGFycmFuZ2UoLXRvdGFsX2RlZikgJT4lIAogIHNlbGVjdCgtcm93X251bWJlciwgLWRhdGUpCgpnZ3Bsb3QoZGF0YSA9IGhlYWQobGF0ZXN0X2RlZl9yYXRpbmcsIDEwKSwgbWFwcGluZz1hZXMoeD10b3RhbF9kZWYsIHk9cmVvcmRlcih0ZWFtLCB0b3RhbF9kZWYpLCBsYWJlbD10b3RhbF9kZWYpKSArIAogIGdlb21fY29sKGZpbGw9IiM4OEMwRDAiKSArCiAgZ2VvbV90ZXh0KHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpKSArCiAgbGFicyh0aXRsZSA9ICJUb3AgMTAgdGVhbXMgd2l0aCB0aGUgc3Ryb25nZXN0IGRlZmVuc2UiLAogICAgICAgc3VidGl0bGUgPSAiQmFzZWQgb24gZ29hbGtlZXBlciBhbmQgbWVhbiBkZWZlbnNlIHJhdGluZ3MiLAogICAgICAgeCA9ICJUb3RhbCBEZWZlbnNlIFJhdGluZyIsCiAgICAgICB5ID0gIlRlYW1zIikgCmBgYAoKIyMjIFRlYW1zIHdpdGggc3Ryb25nZXN0IG1pZGZpZWxkCgpgYGB7cn0KbWlkX2hvbWUgPC0KICBpbnB1dF9kYXRhICU+JSAKICBzZWxlY3QoZGF0ZSwgaG9tZV90ZWFtLCBob21lX3RlYW1fbWVhbl9taWRmaWVsZF9zY29yZSkgJT4lIAogIHJlbmFtZSh0ZWFtID0gaG9tZV90ZWFtLCBtaWRmaWVsZF9yYXRpbmcgPSBob21lX3RlYW1fbWVhbl9taWRmaWVsZF9zY29yZSkKCm1pZF9hd2F5IDwtCiAgaW5wdXRfZGF0YSAlPiUgCiAgc2VsZWN0KGRhdGUsIGF3YXlfdGVhbSwgYXdheV90ZWFtX21lYW5fbWlkZmllbGRfc2NvcmUpICU+JSAKICByZW5hbWUodGVhbSA9IGF3YXlfdGVhbSwgbWlkZmllbGRfcmF0aW5nID0gYXdheV90ZWFtX21lYW5fbWlkZmllbGRfc2NvcmUpCgptaWRfcmF0aW5nIDwtIGRyb3BfbmEocmJpbmQobWlkX2hvbWUsIG1pZF9hd2F5KSkKCiMgR2V0IGxhdGVzdCBtaWRmaWVsZCByYXRpbmcgb2YgZWFjaCB0ZWFtIGFuZCBzaG93IHRvcCAxMApsYXRlc3RfbWlkX3JhdGluZyA8LQogIG1pZF9yYXRpbmcgJT4lIAogIGFycmFuZ2UodGVhbSwgZGVzYyhkYXRlKSkgJT4lIAogIGdyb3VwX2J5KHRlYW0pICU+JSAKICBtdXRhdGUocm93X251bWJlciA9IHJvd19udW1iZXIodGVhbSkpICU+JSAKICBmaWx0ZXIocm93X251bWJlciA9PSAxKSAlPiUgCiAgYXJyYW5nZSgtbWlkZmllbGRfcmF0aW5nKSAlPiUgCiAgc2VsZWN0KC1kYXRlLCAtcm93X251bWJlcikKCmdncGxvdChkYXRhID0gaGVhZChsYXRlc3RfbWlkX3JhdGluZywgMTApLCBtYXBwaW5nPWFlcyh4PW1pZGZpZWxkX3JhdGluZywgeT1yZW9yZGVyKHRlYW0sIG1pZGZpZWxkX3JhdGluZyksIGxhYmVsPW1pZGZpZWxkX3JhdGluZykpICsgCiAgZ2VvbV9jb2woZmlsbD0gIiM4OEMwRDAiKSArCiAgZ2VvbV90ZXh0KHBvc2l0aW9uID0gcG9zaXRpb25fc3RhY2sodmp1c3QgPSAwLjUpKSArCiAgbGFicyh0aXRsZSA9ICJUb3AgMTAgdGVhbXMgd2l0aCB0aGUgc3Ryb25nZXN0IG1pZGZpZWxkIiwKICAgICAgIHN1YnRpdGxlID0gIkJhc2VkIG9uIHRoZSBhdmVyYWdlIHJhdGluZyBvZiB0aGUgNCBoaWdoZXN0IHJhdGVkIG1pZGZpZWxkIHBsYXllcnMgb2YgZWFjaCB0ZWFtIiwKICAgICAgIHggPSAiTWlkZmllbGQgUmF0aW5nIiwKICAgICAgIHkgPSAiVGVhbXMiKQpgYGAKCiMjIyBUZWFtcyB3aXRoIHN0cm9uZ2VzdCBvZmZlbnNlCgpgYGB7cn0Kb2ZmX2hvbWUgPC0KICBpbnB1dF9kYXRhICU+JSAKICBzZWxlY3QoZGF0ZSwgaG9tZV90ZWFtLCBob21lX3RlYW1fbWVhbl9vZmZlbnNlX3Njb3JlKSAlPiUgCiAgcmVuYW1lKHRlYW0gPSBob21lX3RlYW0sIG9mZmVuc2VfcmF0aW5nID0gaG9tZV90ZWFtX21lYW5fb2ZmZW5zZV9zY29yZSkKCm9mZl9hd2F5IDwtCiAgaW5wdXRfZGF0YSAlPiUgCiAgc2VsZWN0KGRhdGUsIGF3YXlfdGVhbSwgYXdheV90ZWFtX21lYW5fb2ZmZW5zZV9zY29yZSkgJT4lIAogIHJlbmFtZSh0ZWFtID0gYXdheV90ZWFtLCBvZmZlbnNlX3JhdGluZyA9IGF3YXlfdGVhbV9tZWFuX29mZmVuc2Vfc2NvcmUpCgpvZmZfcmF0aW5nIDwtIGRyb3BfbmEocmJpbmQob2ZmX2hvbWUsIG9mZl9hd2F5KSkKCiMgR2V0IGxhdGVzdCBvZmZlbnNlIHJhdGluZyBvZiBlYWNoIHRlYW0gYW5kIHNob3cgdG9wIDEwCmxhdGVzdF9vZmZfcmF0aW5nIDwtCiAgb2ZmX3JhdGluZyAlPiUgCiAgYXJyYW5nZSh0ZWFtLCBkZXNjKGRhdGUpKSAlPiUgCiAgZ3JvdXBfYnkodGVhbSkgJT4lIAogIG11dGF0ZShyb3dfbnVtYmVyID0gcm93X251bWJlcih0ZWFtKSkgJT4lIAogIGZpbHRlcihyb3dfbnVtYmVyID09IDEpICU+JSAKICBhcnJhbmdlKC1vZmZlbnNlX3JhdGluZykgJT4lIAogIHNlbGVjdCgtZGF0ZSwgLXJvd19udW1iZXIpCgpnZ3Bsb3QoZGF0YSA9IGhlYWQobGF0ZXN0X29mZl9yYXRpbmcsIDEwKSwgbWFwcGluZz1hZXMoeD1vZmZlbnNlX3JhdGluZywgeT1yZW9yZGVyKHRlYW0sIG9mZmVuc2VfcmF0aW5nKSwgbGFiZWw9b2ZmZW5zZV9yYXRpbmcpKSArCiAgZ2VvbV9jb2woZmlsbD0iIzg4QzBEMCIpICsKICBnZW9tX3RleHQocG9zaXRpb24gPSBwb3NpdGlvbl9zdGFjayh2anVzdCA9IDAuNSkpICsKICBsYWJzKHRpdGxlPSJUb3AgMTAgdGVhbXMgd2l0aCB0aGUgc3Ryb25nZXN0IG9mZmVuc2UiLAogICAgICBzdWJ0aXRsZT0iQmFzZWQgb24gdGhlIGF2ZXJhZ2UgcmF0aW5nIG9mIHRoZSAzIGhpZ2hlc3QgcmF0ZWQgb2ZmZW5zaXZlIHBsYXllcnMgb2YgZWFjaCB0ZWFtIiwKICAgICAgeD0iT2ZmZW5zZSBSYXRpbmciLAogICAgICB5PSJUZWFtcyIpCmBgYAoKIyMgSXMgaXQgYmV0dGVyIHRvIHBsYXkgYXQgaG9tZSA/CgpgYGB7cn0KaG9tZV90ZWFtX2FkdmFudGFnZSA8LQogIGlucHV0X2RhdGEgJT4lIAogIGZpbHRlcihuZXV0cmFsX2xvY2F0aW9uID09IEZBTFNFKSAlPiUgCiAgY291bnQoaG9tZV90ZWFtX3Jlc3VsdCkgJT4lIAogIG11dGF0ZShwZXJjZW50YWdlID0gbGFiZWxfcGVyY2VudCgpKG4vc3VtKG4pKSkKCmdncGxvdChkYXRhID0gaG9tZV90ZWFtX2FkdmFudGFnZSwgbWFwcGluZz1hZXMoeD0iIiwgeT1uLCBmaWxsPWhvbWVfdGVhbV9yZXN1bHQpKSArCiAgZ2VvbV9iYXIod2lkdGggPSAxLCBzdGF0ID0gImlkZW50aXR5IiwgY29sb3I9IndoaXRlIikgKwogIGNvb3JkX3BvbGFyKCJ5IikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNFQkNCOEIiLCAiI0JGNjE2QSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiI0EzQkU4QyIpKQogIHRoZW1lX3ZvaWQoKSArCiAgbGFicyh0aXRsZSA9ICJEaXN0cmlidXRpb24gb2YgbWF0Y2ggcmVzdWx0cyBvZiBob21lIHRlYW1zIiwKICAgICAgIHN1YnRpdGxlID0gIkV4Y2x1ZGluZyBtYXRjaGVzIHBsYXllZCBhdCBuZXV0cmFsIGxvY2F0aW9ucyIsCiAgICAgICBmaWxsPSJSZXN1bHQiKQpgYGAKCiMjIENvcnJlbGF0aW9uIE1hdHJpeAoKYGBge3J9CiMgc2VsZWN0IG51bWVyaWMgY29sdW1ucyBvbmx5CmlucHV0X251bWVyaWNfZGF0YSA8LSBpbnB1dF9kYXRhICU+JQogIHNlbGVjdF9pZihpcy5udW1lcmljKSAlPiUKICBkcm9wX25hKCkKCiMgcmVuYW1lIHZhcmlhYmxlcyBmb3IgZWFzaWVyIGNvcnJlbGF0aW9uIHBsb3QgdmlzdWFsaXphdGlvbgppbnB1dF9udW1lcmljX2RhdGEgPC0gaW5wdXRfbnVtZXJpY19kYXRhICU+JSByZW5hbWUoCiAgcmFuazEgPSBob21lX3RlYW1fZmlmYV9yYW5rLAogIHJhbmsyID0gYXdheV90ZWFtX2ZpZmFfcmFuaywKICB0b3RhbF9maWZhX3BvaW50czEgPSBob21lX3RlYW1fdG90YWxfZmlmYV9wb2ludHMsCiAgdG90YWxfZmlmYV9wb2ludHMyID0gYXdheV90ZWFtX3RvdGFsX2ZpZmFfcG9pbnRzLAogIHNjb3JlMSA9IGhvbWVfdGVhbV9zY29yZSwKICBzY29yZTIgPSBhd2F5X3RlYW1fc2NvcmUsCiAgZ2tfc2NvcmUxID0gaG9tZV90ZWFtX2dvYWxrZWVwZXJfc2NvcmUsCiAgZ2tfc2NvcmUyID0gYXdheV90ZWFtX2dvYWxrZWVwZXJfc2NvcmUsCiAgZGZfc2NvcmUxID0gaG9tZV90ZWFtX21lYW5fZGVmZW5zZV9zY29yZSwKICBkZl9zY29yZTIgPSBhd2F5X3RlYW1fbWVhbl9kZWZlbnNlX3Njb3JlLAogIGF0dF9zY29yZTEgPSBob21lX3RlYW1fbWVhbl9vZmZlbnNlX3Njb3JlLAogIGF0dF9zY29yZTIgPSBhd2F5X3RlYW1fbWVhbl9vZmZlbnNlX3Njb3JlLAogIG1mX3Njb3JlMSA9IGhvbWVfdGVhbV9tZWFuX21pZGZpZWxkX3Njb3JlLAogIG1mX3Njb3JlMiA9IGF3YXlfdGVhbV9tZWFuX21pZGZpZWxkX3Njb3JlCikKCiMgY3JlYXRlIGNvcnJlbGF0aW9uIHBsb3QKaW5wdXRfbnVtZXJpY19kYXRhICU+JQogIGNvcigpICU+JQogIGNvcnJwbG90KAogICAgdHlwZSA9ICJ1cHBlciIsCiAgICBkaWFnID0gRkFMU0UsCiAgICBjb2w9Y29sb3JSYW1wUGFsZXR0ZShjKCJmaXJlYnJpY2siLCJsaWdodHllbGxvdyIsImdyZWVuNCIpKSgxMDApLAogICAgbWV0aG9kID0gInNoYWRlIiwKICAgIHNoYWRlLmNvbCA9IE5BLAogICAgdGwuY29sID0gImJsYWNrIiwKICAgIHRsLnNydCA9IDQ1CiAgKQpgYGAKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCg==